//
//  CZHomeController.swift
//  Weibo27
//
//  Created by apple on 16/4/16.
//  Copyright © 2016年 itcast. All rights reserved.
//

import UIKit
// cell可重用标识
private let HomeTableViewCellIdentifierId = "HomeTableViewCellIdentifierId"

class CZHomeViewController: CZVisitorViewController {
    // 保存微博数据数组
    var status: [CZStatus] = [CZStatus]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // 判断我们用户是否登录
        if !isLogin{
            visitorView?.setVisitorInfo(nil, title: nil)
            return
        }
        setupUI()
        setupTableViewInfo()
        // 请求微博首页数据
//        loadData {[weak self] (statuss) -> () in
//            // 01-赋值
//            self?.status = statuss
//            // 02-刷新UI
//            self?.tableView.reloadData()
//        }
        
        loadData(indicatorView.isAnimating())
    }
    // MARK: -  设置视图
    private func setupUI(){
        navigationController!.view.insertSubview(showCountLabel, belowSubview: navigationController!.navigationBar)
        
        showCountLabel.frame = CGRect(x: 0, y: 64 - 34, width: SCREENW, height: 34)
    }
    
    
    
    
    // MARK: -  设置tableView
    private func setupTableViewInfo(){
        // 注册cell
        tableView.registerClass(CZStatusCell.self, forCellReuseIdentifier: HomeTableViewCellIdentifierId)
        // 设置cell高度
        // UITableViewAutomaticDimension 自动计算行高
        tableView.rowHeight = UITableViewAutomaticDimension
        // 预估行高 预估行高与我们实际的cell高度越接近越好
        tableView.estimatedRowHeight = 200
        // 设置风格
        tableView.separatorStyle = .None
        
        // 设置tablView 的footView
        tableView.tableFooterView = indicatorView
        // 添加下拉刷新控件
        tableView.addSubview(refresh)
        
        refresh.addTarget(self, action: "refreshAction", forControlEvents: UIControlEvents.ValueChanged)

    }
    
    // 下拉刷新调用方法
    @objc private func refreshAction(){
        loadData(indicatorView.isAnimating())
    }
    
    // MARK: -  懒加载控件
    private lazy var indicatorView : UIActivityIndicatorView = {
        let view = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge)
        // 设置菊花颜色
        view.color = ThemeColor
        
      //  view.sizeToFit()
        return view
    }()
    // 自定义刷新控件
    private lazy var refresh: CZRefreshControl = CZRefreshControl()
    // 显示得到多少条数据label
    private lazy var showCountLabel: UILabel = {
        let lab = UILabel(textColor: UIColor.whiteColor(), textFont: 14)
        lab.textAlignment = .Center
        lab.backgroundColor = ThemeColor
        lab.text = "显示微博条数文字"
        lab.hidden = true
        return lab
    }()

}

// MARK: -  tableView dataSource  delegate
extension CZHomeViewController{
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return status.count
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        
        // 方法02 -  我们通过标识到缓存中取 如果取不到 系统帮我们创建一个cell 前提: 需要我们程序员自己注册cell
        // 性能高于我们第一种方法
        let cell = tableView.dequeueReusableCellWithIdentifier(HomeTableViewCellIdentifierId, forIndexPath: indexPath) as! CZStatusCell
        cell.status = status[indexPath.row]
        // 监听转发 评论 赞 按钮点击
        cell.toolBarView.statusToolBarViewsClosure = {[weak self] (type: CZStatusToolBarViewType) in
            print(self?.status[indexPath.row].id)
            
            switch type{
            case .Retweet:
                print("转发")
            case .Comment:
                print("评论")
            case .Unlike:
                print("赞")
            }
            
        }
        
        return cell
    }
    
    
    override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        
        // 判断我们是否已经滑动到tableView 最底部
        // 防止用户在我们网络请求的时候 多次滑动 多次发送请求 加一个条件 只有菊花没有动画的时候在执行
        
        //print(indexPath.row)
        if indexPath.row == status.count - 1 && !indicatorView.isAnimating(){
            // 设置动画
            indicatorView.startAnimating()
            loadData(indicatorView.isAnimating())
        }
    }
}


// MARK: - 请求微博首页数据
extension CZHomeViewController{
    func loadData(isPullUp: Bool){
        
        var sinceId: Int64 = 0
        var maxId: Int64 = 0
        
        // 代表上拉加载更多
        if isPullUp{
            sinceId = 0
            maxId = status.last?.id ?? 0
            // 如果不判断 会返回来重复数据
            if maxId > 0{
                maxId = maxId - 1
            }
            
        }else{
            // 下拉刷新
            sinceId = status.first?.id ?? 0
            maxId = 0
        }
        
        CZStatusDAL.getHomeStatus(sinceId, max_id: maxId) { (array) -> () in
            
            self.endRefreshing()
            if array.count == 0{
                print("获取数据失败")
                return
            }
 
            // 定义一个临时数组
            var tempArray:[CZStatus] = [CZStatus]()
            // 遍历数组 转模型
            for dic in array{
                let status = CZStatus(dict: dic)
                // 往数组中添加模型
                tempArray.append(status)
            }
            // 上拉加载更多
            if isPullUp{
                self.status = self.status + tempArray
            }else{
                // 下拉刷新
                self.status = tempArray + self.status
                
                // 如果我们showCountLabel 已经显示了 不应再执行动画了
                if self.showCountLabel.hidden == true{
                    self.setShowCountLabelAnim(tempArray.count)
                }
            }
            
            // 刷新UI
            self.tableView.reloadData()
            
        }

    }
    
    // 停止动画方法
    func endRefreshing(){
        self.indicatorView.stopAnimating()
        self.refresh.endRefreshing()
    }
    
    func setShowCountLabelAnim(count: Int){
        showCountLabel.hidden = false
        /*
            - 如果count == 0 已经是最新的微博了
            - 如果count != 0 您更新了count条微博
        */
        var countString = ""
        
        if count == 0{
            countString = "您已经是最新的微博了"
        }else{
            countString = "您更新了\(count)条微博"
        }
        // 设置text
        showCountLabel.text = countString
        
        UIView.animateWithDuration(1, animations: { () -> Void in
            self.showCountLabel.frame.origin.y = 64
            
            }) { (_) -> Void in
                UIView.animateWithDuration(1, delay: 1, options: [], animations: { () -> Void in
                    self.showCountLabel.frame.origin.y = 64 - 34
                    }, completion: { (_) -> Void in
                        self.showCountLabel.hidden = true
                })
        }
        
    }
    
}


extension CZHomeViewController{
    func demo(){
        
        // 请求url
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        // 请求参数
        let params = ["access_token": CZUserAccountTools.sharedTools.accessToken!]
        
        CZNetworkTools.sharedTools.request(CZRequestMethod.GET, urlString: urlString, params: params) { (response, error) -> () in
            if error != nil{
                print(error)
                return
            }
            // 判断我们的得到的数据是否存在 而且是否是一个数组
            guard let array = response?["statuses"] as? [[String: AnyObject]] else{
                print("返回的数据不是一个数组")
                return
            }
            // 定义一个临时数组
            var tempArray:[CZStatus] = [CZStatus]()
            // 遍历数组 转模型
            for dic in array{
                let status = CZStatus(dict: dic)
                // 往数组中添加模型
                tempArray.append(status)
            }
            // 执行闭包 告知外界我们的数据请求成功啦
           // callback(statuss: tempArray)
        }

    }
}
